home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / utils / tpipe.zoo / tpipe.c < prev    next >
C/C++ Source or Header  |  1992-07-04  |  2KB  |  67 lines

  1. /* tpipe.c -- tee a pipeline into two pipelines. Like tee(1) but 
  2.    argument is a command or pipeline rather than a file.
  3.  
  4.    See the man page tpipe(1) supplied with this software.
  5.  
  6.    This version uses the unix system calls popen(3), read(2), and
  7.    write(2).  It uses write(2) to write directly to the fileno() of
  8.    of the file pointer stream returned by popen.
  9.  
  10.    I've tried it out under BSD, System V, and an older version of unix,
  11.    but:
  12.  
  13.    THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT EXPRESS OR IMPLIED 
  14.    WARRANTY.
  15.  
  16.    Version 1.02 (4 Mar 1989) (Use fileno())
  17.  
  18. --
  19. David B Rosen, Cognitive & Neural Systems                  rosen@bucasb.bu.edu
  20. Center for Adaptive Systems                 rosen%bucasb@{buacca,bu-it}.bu.edu
  21. Boston University              {mit-eddie,harvard,uunet}!bu.edu!thalamus!rosen
  22.  
  23. */
  24.  
  25. #include <stdio.h>
  26. #ifdef __GNUC__
  27. #include <stdlib.h>
  28. #include <unistd.h>
  29. #endif
  30.  
  31. /*#define NOHACK*/
  32.  
  33. #ifndef BUFSIZ
  34. #define BUFSIZ 2048
  35. #endif /*BUFSIZ*/
  36.  
  37. int main(argc, argv)
  38.      int argc;
  39.      char *argv[];
  40. {
  41.   char buf[BUFSIZ];
  42.   register FILE *subpipeline = NULL;
  43.   register unsigned n;
  44.  
  45.   if (argc == 2){
  46.     if (*argv[1]) {
  47.       if ((subpipeline = popen(argv[1],"w")) == NULL) {
  48.     fprintf(stderr, "%s: can't create subpipeline %s\n", argv[0], argv[1]);
  49.     exit(1);
  50.       }
  51.     }
  52.   } else if (argc > 2) {
  53.     fprintf(stderr, "usage: %s [pipeline]\n", argv[0]);
  54.     exit(2);
  55.   }
  56.  
  57.   while ((n = read(0, buf, BUFSIZ)) > 0) {
  58.     write(1, buf, n); /* write to standard output */
  59.     if (subpipeline) {  /* write to subpipeline: */
  60.       write((int)fileno(subpipeline), buf, n);
  61.     }
  62.   }
  63.  
  64.   if (subpipeline) pclose(subpipeline);
  65.   return 0;
  66. }
  67.